const { body, param, query, validationResult } = require('express-validator');

// 处理验证结果
const handleValidationErrors = (req, res, next) => {
  const errors = validationResult(req);
  if (!errors.isEmpty()) {
    return res.status(400).json({
      error: '数据验证失败',
      details: errors.array()
    });
  }
  next();
};

// 用户注册验证
const validateUserRegistration = [
  body('username')
    .isLength({ min: 2, max: 50 })
    .withMessage('用户名长度必须在2-50个字符之间')
    .matches(/^[\u4e00-\u9fa5a-zA-Z0-9_]+$/)
    .withMessage('用户名只能包含中文、字母、数字和下划线'),
  body('email')
    .isEmail()
    .withMessage('请提供有效的邮箱地址')
    .normalizeEmail(),
  body('password')
    .isLength({ min: 6 })
    .withMessage('密码长度至少6个字符'),
  handleValidationErrors
];

// 用户登录验证
const validateUserLogin = [
  body('email')
    .isEmail()
    .withMessage('请提供有效的邮箱地址')
    .normalizeEmail(),
  body('password')
    .notEmpty()
    .withMessage('密码不能为空'),
  handleValidationErrors
];

// 活动创建验证
const validateActivityCreation = [
  body('title')
    .isLength({ min: 1, max: 255 })
    .withMessage('活动标题长度必须在1-255个字符之间'),
  body('start_time')
    .isISO8601()
    .withMessage('开始时间格式无效'),
  body('end_time')
    .isISO8601()
    .withMessage('结束时间格式无效')
    .custom((value, { req }) => {
      const now = new Date();
      const endTime = new Date(value);
      const startTime = new Date(req.body.start_time);
      
      // 结束时间必须晚于开始时间
      if (endTime <= startTime) {
        throw new Error('结束时间必须晚于开始时间');
      }
      
      // 结束时间必须在未来（允许创建正在进行的活动）
      if (endTime <= now) {
        throw new Error('结束时间必须晚于当前时间');
      }
      
      return true;
    }),
  body('max_participants')
    .optional()
    .isInt({ min: 1 })
    .withMessage('最大参与人数必须是大于0的整数'),
  body('latitude')
    .optional()
    .isFloat({ min: -90, max: 90 })
    .withMessage('纬度必须在-90到90之间'),
  body('longitude')
    .optional()
    .isFloat({ min: -180, max: 180 })
    .withMessage('经度必须在-180到180之间'),
  handleValidationErrors
];

// 动态发布验证
const validateFeedCreation = [
  body('content')
    .optional()
    .isLength({ min: 1, max: 2000 })
    .withMessage('内容长度必须在1-2000个字符之间'),
  body('feed_type')
    .optional()
    .isIn(['activity', 'participation', 'achievement', 'post'])
    .withMessage('动态类型无效'),
  body('media_urls')
    .optional()
    .isArray()
    .withMessage('媒体URL必须是数组格式'),
  body('activity_id')
    .optional()
    .isInt()
    .withMessage('活动ID必须是整数'),
  body('is_public')
    .optional()
    .isBoolean()
    .withMessage('公开状态必须是布尔值'),
  // 自定义验证：确保content或media_urls至少有一个不为空
  body().custom((body) => {
    if (!body.content && (!body.media_urls || body.media_urls.length === 0)) {
      throw new Error('动态内容或媒体文件至少需要提供一个');
    }
    return true;
  }),
  handleValidationErrors
];

// 签到验证
const validateCheckIn = [
  param('id')
    .isInt()
    .withMessage('活动ID必须是整数'),
  body('latitude')
    .optional()
    .isFloat({ min: -90, max: 90 })
    .withMessage('纬度必须在-90到90之间'),
  body('longitude')
    .optional()
    .isFloat({ min: -180, max: 180 })
    .withMessage('经度必须在-180到180之间'),
  body('verification_code')
    .optional()
    .isLength({ min: 4, max: 10 })
    .withMessage('验证码长度必须在4-10个字符之间'),
  handleValidationErrors
];

// 分页验证
const validatePagination = [
  query('page')
    .optional()
    .isInt({ min: 1 })
    .withMessage('页码必须是大于0的整数'),
  query('limit')
    .optional()
    .isInt({ min: 1, max: 100 })
    .withMessage('每页数量必须在1-100之间'),
  handleValidationErrors
];

module.exports = {
  validateUserRegistration,
  validateUserLogin,
  validateActivityCreation,
  validateFeedCreation,
  validateCheckIn,
  validatePagination,
  handleValidationErrors
}; 